package demo;

import java.util.List;

import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;

import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;

import org.hilo.boot.core.code.Desc;
import org.hilo.boot.core.code.FieldInfo;
import org.hilo.boot.core.code.ServiceCodeGenerator;

/**
 * 标准API代码生成器 使用示例
 * 
 * 在项目中引入依赖：
   <dependency>
      <groupId>org.hilo.boot</groupId>
      <artifactId>hilo-api-generator</artifactId>
      <version>{打开Maven仓库查看最新版本}</version>
   </dependency>
 */
//@Ignore
public class UserServiceGenerator {
    ServiceCodeGenerator generator;
    // 配置好Service的名称，以及文件输出路径，然后以单元测试的方式运行
    @Before
    public void init() throws Exception {
        // packageName包名, serviceName类名（区分大小写，无须Service后缀）
        generator = new ServiceCodeGenerator("com.yourcompany.hilo.admin", "User");
        generator.defaultAuthor("zollty");
        generator.defaultOutputDir("D:\\__SYNC2\\git\\hilo\\hilo-component\\hilo-api-generator\\src\\test\\java");
    }
    
    /**
     * 定义Service的一个方法：
     * 
     * name(定义方法名，方法说明)
     * params（定义字段信息）
     */
    @Test
    public void addUser() {
        //    name：方法（Method）名称，注释
        generator.name("addUser", "添加新用户")
        .params(new FieldInfo() { // FieldInfo：字段（Field）定义
            
            @Desc("用户名") // 字段的注释
            @NotBlank  // javax.validation 校验（可有可无）
            String username; // 字段的类型 和 名称
            
            @Desc("用户密码")
            String password;
            
            @Desc("邮箱")
            @Email
            @NotBlank
            String email;
            
            @Desc("手机号")
            String mobile;
            
            @Desc("创建人ID")
            @NotNull
            Long createUserid;
            
            @Desc("角色ID列表")
            List<Long> roleIdList;
        })
        .results(Long.class, "userId", "用户ID") // 方法的返回值
//      .results(String.class, "password", "用户密码") // 可以有0~N个字段
        // 注意配置
        .build(false, false); // 第一个参数为true，则每个方法单独一个类，方便更新！
                              // 第二个参数为true，则文件生成好之后，自动打开生成的目录
    }
    
    // 定义Service的第二个方法，用法同上
    @Test
    public void updateUser() {
        generator.name("updateUser", "更新用户信息")
        .params(new FieldInfo() {
            @Desc("用户名")
            @NotBlank
            String username;
            @Desc("用户密码")
            String password;
            @Desc("邮箱")
            @Email
            @NotBlank
            String email;
            @Desc("手机号")
            String mobile;
            @Desc("更新人ID")
            @NotNull
            Long modifyUserid;
            @Desc("角色ID列表")
            List<Long> roleIdList;
        })
        .build(true, false);
    }
    
    @Test
    public void changePassword() {
        generator.name("changePassword", "修改用户密码")
        .params(new FieldInfo() {
            @Desc("用户ID")
            @NotNull
            Long userId;
            @Desc("旧密码")
            @NotEmpty
            String oldPassword;
            @Desc("新密码")
            @NotEmpty
            String newPassword;
        })
        .build(true, false);
    }


}
